import java.util.Collection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class StrUtil {

    private static Pattern linePattern = Pattern.compile("_(\\w)");

    private static Pattern humpPattern = Pattern.compile("[A-Z]");

    /**
     * 下划线转驼峰
     *
     * @param str
     * @return
     */
    public static String lineToHump(String str) {

        if (null == str || "".equals(str)) {
            return str;
        }
        str = str.toLowerCase();
        Matcher matcher = linePattern.matcher(str);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
        }
        matcher.appendTail(sb);

        str = sb.toString();
        str = str.substring(0, 1).toUpperCase() + str.substring(1);

        return str;
    }

    /**
     * 驼峰转下划线,效率比上面高
     *
     * @param str
     * @return
     */
    public static String humpToLine(String str) {

        Matcher matcher = humpPattern.matcher(str);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
        }
        matcher.appendTail(sb);
        return sb.toString();
    }

    /**
     * 驼峰转下划线(简单写法，效率低于{@link #humpToLine(String)})
     *
     * @param str
     * @return
     */
    public static String humpToLine2(String str) {

        return str.replaceAll("[A-Z]", "_$0").toLowerCase();
    }

    /**
     * tips 存在一个是  "" 或"  "或 null 返回 true
     *
     * @Author:hihuzi 2018/5/3 16:09
     */
    public static Boolean isNullAndEmpty(String... strs) {

        for (String str : strs) {
            if (str == null || str.equals("") || str.trim().length() <= 0)
                return true;
        }
        return false;
    }


    /**
     * tips 存在一个是  "" 或"  "或 null 返回 true
     *
     * @Author:hihuzi 2018/5/3 16:09
     */
    public static Boolean isNullOrEmpty(String... strs) {

        for (String str : strs) {
            if (str == null || str.equals("") || str.trim().length() <= 0)
                return true;
        }
        return false;
    }

    /**
     * tips 不存在  "" 和"  "和 null 返回 true
     * tips 存在一个是  "" 或"  "或 null 返回 false
     *
     * @Author:hihuzi 2018/5/3 16:09
     */
    public static Boolean isNotNullAndEmpty(String... str) {

        return !isNullAndEmpty(str);
    }

    /**
     * tips 不存在  "" 或"  "或 null 返回 true
     * tips 存在一个是  "" 或"  "或 null 返回 false
     *
     * @Author:hihuzi 2018/5/3 16:09
     */
    public static Boolean isNotNullOrEmpty(String... str) {

        return !isNullOrEmpty(str);
    }

    /**
     * tips 全都是  "" 或"  "或 null 返回 true
     *
     * @Author:hihuzi 2018/5/3 16:09
     */
    public static Boolean isNullButEmpty(String... strs) {

        int i = 0;
        for (String str : strs) {
            if (str == null || "".equals(str) || str.trim().length() <= 0)
                i++;
        }
        if (strs.length == i) {
            return true;
        } else return false;
    }

    /**
     * tips 存在一个是  "" 或"  "或 null 返回 true
     *
     * @Author:hihuzi 2018/5/3 16:09
     */
    public static Boolean isNotNullButEmpty(String... str) {

        return !isNullButEmpty(str);
    }

    /**
     * tips 存在一个是  null 或size 为0 返回 true
     *
     * @Author:hihuzi 2018/5/8 15:36
     */
    public static <E> Boolean isNullOrEmptyCollections(Collection<E>... collections) {

        for (Collection<E> c : collections) {
            if (c == null || c.size() == 0)
                return true;
        }
        return false;
    }

    /**
     * tips 全部不是  null 或size=0 返回 true
     * tips 存在一个是  null 或size=0 返回 false
     *
     * @Author:hihuzi 2018/7/7 8:37
     */
    public static <E> Boolean isNotNullOrEmptyCollections(Collection<E>... collections) {

        return !isNullOrEmptyCollections(collections);
    }

    /**
     * tips t 存在一个是  null  返回 true
     *
     * @Author:hihuzi 2018/5/10 15:07
     */
    public static <T> Boolean isNullOrEmptyEntrty(T... t) {

        for (T c : t) {
            if (c == null || t.length == 0)
                return true;
        }
        return false;
    }

    /**
     * tips t 存在一个是  null  返回 flase
     * tips t 全都不是 null 返回 true
     *
     * @Author:hihuzi 2018/5/10 15:07
     */
    public static <T> Boolean isNotNullOrEmptyEntrty(T... t) {

        return !isNullOrEmptyEntrty(t);
    }

}
